package com.hxkj.service.impl;

import com.hxkj.dao.AuthFunctionDao;
import com.hxkj.domain.po.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName initializeMapper
 * @Author Mr.zhu
 * @Date 2018/5/23 15:46
 * @Version 1.0
 */
@Service("initializeFunctionService")
public class InitializeFunctionService {

    @Resource
    private AuthFunctionDao authFunctionDao;

    // 创建子站点时 给主站超级管理员与子站关联  用户站点
    public UserSite initializeUserSite(Long siteId) {
        /*初始化 主站超级管理员与子站关联 start */
        UserSite userSite = new UserSite();
        userSite.setSiteId(siteId);
        userSite.setUserId(1L);
        userSite.setDelTag(0L);
        userSite.setCreateTime(System.currentTimeMillis());
        /*初始化 主站超级管理员与子站关联 end */
        return userSite;
    }

    // 创建子站点时 给主站超级管理员权限关联 用户角色
    public AuthUserRoleApp initializeAuthUserRoleApp(AuthRole authRole) {
        /*初始化 主站超级管理员与子站角色关联 start */
        AuthUserRoleApp userRole = new AuthUserRoleApp();
        userRole.setRoleId(authRole.getRoleId());
        userRole.setUserId(1L);
        userRole.setAppId(1l);
        userRole.setCreateTime(System.currentTimeMillis());
        /*初始化角色 主站超级管理员与子站角色关联 end */
        return userRole;
    }

    // 创建子站点时 初始化角色 子站超级管理员
    public AuthRole initializeAuthRole(Site site) {
        /*初始化角色 子站超级管理员 start */
        AuthRole authRole = new AuthRole();
        authRole.setSiteId(site.getSiteId());
        authRole.setRoleName(site.getSiteName() + "管理员");
        authRole.setComment("超级管理员");
        authRole.setDelTag((byte) 0);
        authRole.setCreateTime(System.currentTimeMillis());
        authRole.setUpdateTime(System.currentTimeMillis());
        authRole.setRoleStatus((byte) 0);
        authRole.setRoleCode("admin");
        authRole.setRoleType(1l);
        /*初始化角色 子站超级管理员 end */
        return authRole;
    }

    //创建子站点时 初始化功能
    public AuthFunction initializeSiteManger(Long siteId) {
        AuthFunction system = new AuthFunction();
        /*初始化子站平台管理 start */
        system.setFunctionCode("user:admin"); // 功能权限编码
        system.setFunctionName("子站平台管理"); // 功能权限名称
        system.setDescription("");    // 说明
        system.setFunctionType((byte) 1);    // 功能权限类型(1 菜单、2 功能、3按钮)
        system.setFunctionUri("0");   // 功能权限链接
        system.setPermission("0");
        system.setFunctionSuperior(0L);
        system.setOrderId((byte) 0);    // 排序ID
        system.setLogSign((byte) 0);   // 是否记录日志
        system.setFunctionStatus((byte) 0);    // 功能状态
        system.setDelTag((byte) 0);     // 删除标识
        system.setParentFunctionId(-1L);    // 上级功能id
        system.setFunctionIcon("icon-3");  //功能图标
        system.setSiteId(siteId);    // 功能站点id
        /*初始化子站平台管理 end */
        return system;
    }

    // 创建子站点时 初始化功能
    @Transactional(rollbackFor = Exception.class)
    public List<AuthFunction> initializeFuncition(Long siteId, Long functionId) {
        List<AuthFunction> list = new ArrayList<>();
        AuthFunction function = new AuthFunction();
        AuthFunction role = new AuthFunction();
        AuthFunction user = new AuthFunction();
        AuthFunction dashbord = new AuthFunction();

        // 初始化首页
        dashbord.setFunctionName("首页"); // 功能权限名称
        dashbord.setDescription("");    // 说明
        dashbord.setFunctionType((byte) 1);    // 功能权限类型(1 菜单、2 功能、3按钮)
        dashbord.setFunctionUri("/dashboard");   // 功能权限链接
        dashbord.setPermission("0");
        dashbord.setFunctionSuperior(0L);
        dashbord.setOrderId((byte) 0);    // 排序ID
        dashbord.setLogSign((byte) 0);   // 是否记录日志
        dashbord.setFunctionStatus((byte) 0);    // 功能状态
        dashbord.setDelTag((byte) 0);     // 删除标识
        dashbord.setParentFunctionId(-1L);    // 上级功能id
        dashbord.setFunctionIcon("icon-3");  //功能图标
        dashbord.setSiteId(siteId);    // 功能站点id

        authFunctionDao.save(dashbord);


        // 初始化功能管理
//        function.setFunctionCode("function:view"); // 功能权限编码
        function.setFunctionName("功能管理"); // 功能权限名称
        function.setDescription("");    // 说明
        function.setFunctionType((byte) 1);    // 功能权限类型(1 菜单、2 功能、3按钮)
        function.setFunctionUri("/sysFunc/index");   // 功能权限链接
        function.setPermission("");
        function.setFunctionSuperior(0L);
        function.setOrderId((byte) 0);   // 排序ID
        function.setLogSign((byte) 0);  // 是否记录日志
        function.setFunctionStatus((byte) 0);    // 功能状态
        function.setDelTag((byte) 0);    // 删除标识
        function.setParentFunctionId(functionId);    // 上级功能id
        function.setFunctionIcon("icon-2");  //功能图标
        function.setSiteId(siteId);    // 功能站点id

        // 添加功能
        authFunctionDao.save(function);
        initializeApiFunction(function);

        // 初始化角色管理
//        role.setFunctionCode("role:view"); // 功能权限编码
        role.setFunctionName("角色管理"); // 功能权限名称
        role.setDescription("");    // 说明
        role.setFunctionType((byte) 1);    // 功能权限类型(1 菜单、2 功能、3按钮)
        role.setFunctionUri("/sysRole/index");   // 功能权限链接
        role.setPermission("sys:view");
        role.setFunctionSuperior(0L);
        role.setOrderId((byte) 0);    // 排序ID
        role.setLogSign((byte) 0);   // 是否记录日志
        role.setFunctionStatus((byte) 0);    // 功能状态
        role.setDelTag((byte) 0);    // 删除标识
        role.setParentFunctionId(functionId);    // 上级功能id
        role.setFunctionIcon("icon-5");  //功能图标
        role.setSiteId(siteId);    // 功能站点id

        authFunctionDao.save(role);
        initializeApiRole(role);



        // 初始化用户管理
//        user.setFunctionCode("user:view"); // 功能权限编码
        user.setFunctionName("用户管理"); // 功能权限名称
        user.setDescription("");    // 说明
        user.setFunctionType((byte) 1);    // 功能权限类型(1 菜单、2 功能、3按钮)
        user.setFunctionUri("/sysUser/index");   // 功能权限链接
        user.setPermission("");
        user.setFunctionSuperior(0L);
        user.setOrderId((byte) 0);    // 排序ID
        user.setLogSign((byte) 0);   // 是否记录日志
        user.setFunctionStatus((byte) 0);    // 功能状态
        user.setDelTag((byte) 0);    // 删除标识
        user.setParentFunctionId(functionId);    // 上级功能id
        user.setFunctionIcon("icon-3");  //功能图标
        user.setSiteId(siteId);    // 功能站点id

        authFunctionDao.save(user);
        initializeApiUser(user);

        //
        list.add(function);
        list.add(role);
        list.add(user);
        list.add(dashbord);
        return list;
    }


    private void initializeApiFunction(AuthFunction function) {

        AuthFunction add = new AuthFunction();
        add.setFunctionCode("function:add"); // 功能权限编码
        add.setFunctionName("添加"); // 功能权限名称
        add.setDescription("");    // 说明
        add.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        add.setPermission("");
        add.setFunctionSuperior(0L);
        add.setOrderId((byte) 0);   // 排序ID
        add.setLogSign((byte) 0);  // 是否记录日志
        add.setFunctionStatus((byte) 0);    // 功能状态
        add.setDelTag((byte) 0);    // 删除标识
        add.setParentFunctionId(function.getFunctionId());    // 上级功能id
        add.setFunctionIcon("icon-2");  //功能图标
        add.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(add);

        AuthFunction remove = new AuthFunction();
        remove.setFunctionCode("function:remove"); // 功能权限编码
        remove.setFunctionName("删除"); // 功能权限名称
        remove.setDescription("");    // 说明
        remove.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        remove.setPermission("");
        remove.setFunctionSuperior(0L);
        remove.setOrderId((byte) 0);   // 排序ID
        remove.setLogSign((byte) 0);  // 是否记录日志
        remove.setFunctionStatus((byte) 0);    // 功能状态
        remove.setDelTag((byte) 0);    // 删除标识
        remove.setParentFunctionId(function.getFunctionId());    // 上级功能id
        remove.setFunctionIcon("icon-2");  //功能图标
        remove.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(remove);



        AuthFunction modify = new AuthFunction();
        modify.setFunctionCode("function:modify"); // 功能权限编码
        modify.setFunctionName("修改"); // 功能权限名称
        modify.setDescription("");    // 说明
        modify.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        modify.setPermission("");
        modify.setFunctionSuperior(0L);
        modify.setOrderId((byte) 0);   // 排序ID
        modify.setLogSign((byte) 0);  // 是否记录日志
        modify.setFunctionStatus((byte) 0);    // 功能状态
        modify.setDelTag((byte) 0);    // 删除标识
        modify.setParentFunctionId(function.getFunctionId());    // 上级功能id
        modify.setFunctionIcon("icon-2");  //功能图标
        modify.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(modify);

        AuthFunction view = new AuthFunction();
        view.setFunctionCode("function:view"); // 功能权限编码
        view.setFunctionName("查询"); // 功能权限名称
        view.setDescription("");    // 说明
        view.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        view.setPermission("");
        view.setFunctionSuperior(0L);
        view.setOrderId((byte) 0);   // 排序ID
        view.setLogSign((byte) 0);  // 是否记录日志
        view.setFunctionStatus((byte) 0);    // 功能状态
        view.setDelTag((byte) 0);    // 删除标识
        view.setParentFunctionId(function.getFunctionId());    // 上级功能id
        view.setFunctionIcon("icon-2");  //功能图标
        view.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(view);
    }

    private void initializeApiRole(AuthFunction function) {

        AuthFunction add = new AuthFunction();
        add.setFunctionCode("role:add"); // 功能权限编码
        add.setFunctionName("添加"); // 功能权限名称
        add.setDescription("");    // 说明
        add.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        add.setPermission("");
        add.setFunctionSuperior(0L);
        add.setOrderId((byte) 0);   // 排序ID
        add.setLogSign((byte) 0);  // 是否记录日志
        add.setFunctionStatus((byte) 0);    // 功能状态
        add.setDelTag((byte) 0);    // 删除标识
        add.setParentFunctionId(function.getFunctionId());    // 上级功能id
        add.setFunctionIcon("icon-2");  //功能图标
        add.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(add);

        AuthFunction remove = new AuthFunction();
        remove.setFunctionCode("role:remove"); // 功能权限编码
        remove.setFunctionName("删除"); // 功能权限名称
        remove.setDescription("");    // 说明
        remove.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        remove.setPermission("");
        remove.setFunctionSuperior(0L);
        remove.setOrderId((byte) 0);   // 排序ID
        remove.setLogSign((byte) 0);  // 是否记录日志
        remove.setFunctionStatus((byte) 0);    // 功能状态
        remove.setDelTag((byte) 0);    // 删除标识
        remove.setParentFunctionId(function.getFunctionId());    // 上级功能id
        remove.setFunctionIcon("icon-2");  //功能图标
        remove.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(remove);



        AuthFunction modify = new AuthFunction();
        modify.setFunctionCode("role:modify"); // 功能权限编码
        modify.setFunctionName("修改"); // 功能权限名称
        modify.setDescription("");    // 说明
        modify.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        modify.setPermission("");
        modify.setFunctionSuperior(0L);
        modify.setOrderId((byte) 0);   // 排序ID
        modify.setLogSign((byte) 0);  // 是否记录日志
        modify.setFunctionStatus((byte) 0);    // 功能状态
        modify.setDelTag((byte) 0);    // 删除标识
        modify.setParentFunctionId(function.getFunctionId());    // 上级功能id
        modify.setFunctionIcon("icon-2");  //功能图标
        modify.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(modify);

        AuthFunction view = new AuthFunction();
        view.setFunctionCode("role:view"); // 功能权限编码
        view.setFunctionName("查询"); // 功能权限名称
        view.setDescription("");    // 说明
        view.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        view.setPermission("");
        view.setFunctionSuperior(0L);
        view.setOrderId((byte) 0);   // 排序ID
        view.setLogSign((byte) 0);  // 是否记录日志
        view.setFunctionStatus((byte) 0);    // 功能状态
        view.setDelTag((byte) 0);    // 删除标识
        view.setParentFunctionId(function.getFunctionId());    // 上级功能id
        view.setFunctionIcon("icon-2");  //功能图标
        view.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(view);
    }

    private void initializeApiUser(AuthFunction function) {

        AuthFunction add = new AuthFunction();
        add.setFunctionCode("user:add"); // 功能权限编码
        add.setFunctionName("添加"); // 功能权限名称
        add.setDescription("");    // 说明
        add.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        add.setPermission("");
        add.setFunctionSuperior(0L);
        add.setOrderId((byte) 0);   // 排序ID
        add.setLogSign((byte) 0);  // 是否记录日志
        add.setFunctionStatus((byte) 0);    // 功能状态
        add.setDelTag((byte) 0);    // 删除标识
        add.setParentFunctionId(function.getFunctionId());    // 上级功能id
        add.setFunctionIcon("icon-2");  //功能图标
        add.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(add);

        AuthFunction remove = new AuthFunction();
        remove.setFunctionCode("user:remove"); // 功能权限编码
        remove.setFunctionName("删除"); // 功能权限名称
        remove.setDescription("");    // 说明
        remove.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        remove.setPermission("");
        remove.setFunctionSuperior(0L);
        remove.setOrderId((byte) 0);   // 排序ID
        remove.setLogSign((byte) 0);  // 是否记录日志
        remove.setFunctionStatus((byte) 0);    // 功能状态
        remove.setDelTag((byte) 0);    // 删除标识
        remove.setParentFunctionId(function.getFunctionId());    // 上级功能id
        remove.setFunctionIcon("icon-2");  //功能图标
        remove.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(remove);



        AuthFunction modify = new AuthFunction();
        modify.setFunctionCode("user:modify"); // 功能权限编码
        modify.setFunctionName("修改"); // 功能权限名称
        modify.setDescription("");    // 说明
        modify.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        modify.setPermission("");
        modify.setFunctionSuperior(0L);
        modify.setOrderId((byte) 0);   // 排序ID
        modify.setLogSign((byte) 0);  // 是否记录日志
        modify.setFunctionStatus((byte) 0);    // 功能状态
        modify.setDelTag((byte) 0);    // 删除标识
        modify.setParentFunctionId(function.getFunctionId());    // 上级功能id
        modify.setFunctionIcon("icon-2");  //功能图标
        modify.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(modify);

        AuthFunction view = new AuthFunction();
        view.setFunctionCode("user:view"); // 功能权限编码
        view.setFunctionName("查询"); // 功能权限名称
        view.setDescription("");    // 说明
        view.setFunctionType((byte) 2);    // 功能权限类型(1 菜单、2 功能)
        view.setPermission("");
        view.setFunctionSuperior(0L);
        view.setOrderId((byte) 0);   // 排序ID
        view.setLogSign((byte) 0);  // 是否记录日志
        view.setFunctionStatus((byte) 0);    // 功能状态
        view.setDelTag((byte) 0);    // 删除标识
        view.setParentFunctionId(function.getFunctionId());    // 上级功能id
        view.setFunctionIcon("icon-2");  //功能图标
        view.setSiteId(function.getSiteId());    // 功能站点id
        authFunctionDao.save(view);
    }
}
